package com.osdp.gateway.resolver;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * host地址令牌方式
 * Resolver解析器,在网关配置里面使用，如下：
 * "filters":[
 *            {
 * 				"args":{
 * 					"key-resolver":"#{@hostAddrKeyResolver}",
 * 					"redis-rate-limiter.burstCapacity":"100",
 * 					"redis-rate-limiter.replenishRate":"10"
 *                },
 * 				"name":"RequestRateLimiter"
 *            }
 * 		],
 *
 * Redis RateLimiter 需要引用 spring-boot-starter-data-redis-reactive
 *
 * 这个逻辑使用令牌桶算法
 * redis-rate-limiter.replenishRate ： 允许用户每秒处理多少个请求。这是令牌桶被填充的速率。
 * redis-rate-limiter.burstCapacity ： 用户在一秒钟内允许执行的最大请求数。这是令牌桶可以容纳的令牌数量。将此值设置为0将阻塞所有请求。
 */
@Slf4j
public class HostAddrKeyResolver implements KeyResolver {

    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        //获取访问者IP
        String ip = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
        if(log.isInfoEnabled()){
            log.info("访问者IP: {}",ip);
        }
        return Mono.just(ip);//通过访问者IP限流,限流使用的是Redis中的令牌桶算法
    }
}
